package com.cql.web.controller.business;

import com.cql.common.core.DO.UserDO;
import com.cql.common.core.DTO.MomentDTO;
import com.cql.common.core.base.AjaxResult;
import com.cql.common.core.base.BaseController;
import com.cql.common.core.security.LoginUser;
import com.cql.framework.config.security.service.TokenService;
import com.cql.service.business.MomentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * @author cql
 */
@RestController
@RequestMapping("/moment")
public class MomentController extends BaseController {


    @Autowired
    private MomentService momentService;

    @Autowired
    private TokenService tokenService;

    /**
     * 关于发表分享功能的思考:
     * 1.如果解决用户编辑时间过长，token失效问题
     * (1)自动保存，隔一段时间请求后端接口保存草稿[建议]
     * (2)维持一个心跳[不太好]
     * <p>
     * 2.如果优雅解决 草稿 与 发布功能
     * 用户访问发布文章页面，则立即请求后端，创建一个“草稿”文章（只有标题数据等几个默认数据，状态为草稿）
     * 用户点击保存草稿，则更新内容，状态改为草稿
     * 用户点击发布，则更新内容，状态改为正在审核
     * 用户关闭网页了，或者取消编辑了，则在数据库删除该文章
     * <p>
     * 3.审核功能
     * 可以设置为人工审核和自动审核
     * 自动审核可以使用python来实现，通过消息队列RocketMq进行通信
     * <p>
     * 4.标题可以重复么
     * <p>
     * 5.文章地区如何设置
     * <p>
     * 6.图片删除
     * <p>
     * 7.由已发布 -》 草稿？
     * 已发布变为草稿，需重新审核
     * <p>
     * 8.权限
     * 只有食客才允许访问
     * <p>
     * 9.正在审核的文章？
     * 正在审核的文章不可修改，不可删除
     * TODO 10.如何防止攻击...
     *
     * @param moment
     * @param request
     * @return
     */
    @PostMapping
    public AjaxResult insertOrUpdateMoment(@RequestBody MomentDTO moment, HttpServletRequest request) {
        UserDO user = tokenService.getLoginUser(request).getUserDO();
        moment.setUserId(user.getUserId());

        MomentDTO result = momentService.insertOrUpdateMoment(moment);

        logger.info("用户 {} 创建或更新文章: {}", user.getAccount(), moment);

        return AjaxResult.success(result);
    }

    /**
     * 删除文章
     * 需权限
     *
     * @param momentId
     * @param request
     * @return
     */
    @PostMapping("/{momentId}")
    public AjaxResult deleteMomentById(@PathVariable("momentId") Long momentId, HttpServletRequest request) {
        UserDO user = tokenService.getLoginUser(request).getUserDO();
        momentService.deleteMomentById(user.getUserId(), momentId);
        logger.info("用户 {} 删除文章: {}", user.getAccount(), momentId);
        return AjaxResult.success();
    }

    /**
     * 根据id获取文章信息(主要用于修改和更新的时候用的，而不是用户查看真正的文章用的)
     *
     * @param momentId
     * @return
     */
    @PreAuthorize("@auth.hasRole('diner')")
    @GetMapping("/update/{momentId}")
    public AjaxResult getMomentUpdateById(@PathVariable("momentId") Long momentId, HttpServletRequest request) {
        LoginUser loginUser = tokenService.getLoginUser(request);
        MomentDTO moment = null;
        UserDO user = loginUser.getUserDO();
        moment = momentService.getMomentUpdateById(momentId, user.getUserId());
        logger.info("{}-访问文章: {}", user.getAccount(), moment);
        return AjaxResult.success(moment);
    }

}
